package com.copd.service;

import com.copd.dto.LogCreateRequest;
import com.copd.dto.OperationLogQueryRequest;
import com.copd.entity.DoctorOperationLog;
import com.copd.entity.DoctorOperationDetail;

import java.util.List;
import java.util.Map;

public interface DoctorOperationLogService {
    
    /**
     * 记录操作日志（包含详细记录）
     * @param request 日志创建请求
     * @return 创建的日志ID
     */
    Integer createLog(LogCreateRequest request);
    
    /**
     * 查询操作日志列表
     * @param request 查询条件
     * @return 日志列表和总数
     */
    Map<String, Object> queryLogs(OperationLogQueryRequest request);
    
    /**
     * 查询操作日志列表并按时间和患者ID分组
     * @param request 查询条件
     * @return 按时间和患者ID分组的日志列表和总数
     */
    Map<String, Object> queryGroupedLogs(OperationLogQueryRequest request);
    
    /**
     * 根据ID获取日志详情
     * @param logId 日志ID
     * @return 日志详情（包含操作详情）
     */
    Map<String, Object> getLogById(Integer logId);
    
    /**
     * 检查医生ID是否存在且是医生角色
     * @param doctorId 医生ID
     * @return 是否存在
     */
    boolean checkDoctorExists(Integer doctorId);
    
    /**
     * 查询备份相关的操作日志列表
     * @param request 查询条件
     * @return 备份相关的日志列表和总数
     */
    Map<String, Object> queryBackupLogs(OperationLogQueryRequest request);
    
    /**
     * 由服务层自动记录患者管理操作日志
     * @param doctorId 医生ID
     * @param patientId 患者ID
     * @param operationType 操作类型
     * @param ipAddress 操作者IP
     * @param deviceInfo 设备信息
     * @param isSuccess 操作是否成功
     * @param failureReason 失败原因
     * @param tableName 操作表
     * @param recordId 记录ID
     * @param detail JSON格式的操作详情
     * @return 创建的日志ID
     */
    Integer logPatientOperation(
        Integer doctorId,
        Integer patientId,
        String operationType,
        String ipAddress,
        String deviceInfo,
        boolean isSuccess,
        String failureReason,
        String tableName,
        Integer recordId,
        String detail
    );
    
    /**
     * 删除指定患者的所有操作日志
     * @param patientId 患者ID
     * @return 是否删除成功
     */
    boolean deletePatientOperationLogs(Integer patientId);
} 